#!/bin/bash
action=$1
target=$2
args=$@

DE_BASE=/opt

source ${DE_BASE}/dataease/.env

export COMPOSE_HTTP_TIMEOUT=180

compose_files="-f docker-compose.yml"
compose_cmd="docker-compose"
server_url=""
current_version=""
latest_version=""
owner=""
repo=""

docker-compose version >/dev/null 2>&1
if [ $? -ne 0 ]; then
   docker compose version >/dev/null 2>&1
   if [ $? -ne 0 ]; then
      compose_cmd="docker compose"
   fi
fi

if [ "${DE_ENGINE_MODE}" = "local" ]; then
   if [[ ! ${DE_EXTERNAL_KETTLE} ]] || [ ${DE_EXTERNAL_KETTLE} = "false" ]; then
     compose_files="${compose_files} -f docker-compose-kettle.yml"
   fi

   if [[ ! ${DE_EXTERNAL_DORIS} ]] || [ ${DE_EXTERNAL_DORIS} = "false" ]; then
     compose_files="${compose_files} -f docker-compose-doris.yml"
   fi
fi

if [[ ! ${DE_EXTERNAL_MYSQL} ]] || [ ${DE_EXTERNAL_MYSQL} = "false" ]; then
  compose_files="${compose_files} -f docker-compose-mysql.yml"
fi

function usage() {
   echo "DATAEASE 控制脚本"
   echo
   echo "Usage: "
   echo "  ./dectl [COMMAND] [ARGS...]"
   echo "  ./dectl --help"
   echo
   echo "Commands: "
   echo "  status                查看 DATAEASE 服务运行状态"
   echo "  start                 启动 DATAEASE 服务"
   echo "  stop                  停止 DATAEASE 服务"
   echo "  restart               重启 DATAEASE 服务"
   echo "  reload                重新加载 DATAEASE 服务"
   echo "  uninstall             卸载 DATAEASE 服务"
   echo "  upgrade               升级 DATAEASE 服务"
   echo "  backup                备份 DATAEASE 服务"
   echo "  restore xxx.tar.gz    还原 DATAEASE 服务"
   echo "  version               查看 DATAEASE 版本信息"
   echo "  clear-images          清理 DATAEASE 旧版本的相关镜像"
   echo "  clear-logs            清理 DATAEASE 历史日志以及 Doris 临时日志"
}
function _healthcheck() {
   echo
   container_name=$(grep "container_name" $DE_BASE/dataease/docker-compose.yml | awk -F': ' '{print $2}')
   sleep 1
   if [ -z $(docker ps --filter "name=$container_name" -q) ];then
      echo "未找到容器 $container_name。"
      exit 1
   fi

   for b in {1..90}
   do
      sleep 1
      read status healthy<<<$(docker inspect $container_name --format '{{.State.Status}} {{.State.Health.Status}}')
      if [[ "$healthy" == "starting" ]];then
         printf "\rDataEase 服务状态 : 正在启动 ... %3ds" $b
      elif [[ "$status" == "running" ]] && [[ "$healthy" == "healthy" ]];then
         printf "\rDataEase 服务状态 : 正常运行          "
         echo
         return;
      else
         echo
         echo -e "DataEase 服务状态 : \033[31m无法访问\033[0m"
         exit 1
      fi
   done
   echo
   echo "【警告】服务在等待时间内未完全启动！请稍后使用 dectl status 检查服务运行状况。"
   echo
}
function _get_current_version() {
   de_current_version=$(grep "^    image:.*/dataease:" ${DE_BASE}/dataease/docker-compose.yml | awk -F'dataease:' '{print $2}')
   if test -z $de_current_version; then
      echo "获取当前版本失败，请检查当前版本是否正确"
      exit 1
   fi
   current_version=$de_current_version
}
function _get_available_server() {
   git_urls=('gitee.com' 'github.com')
   for git_url in ${git_urls[*]}
   do
      echo -ne "检测 ${git_url} ... "
      curl -m 5 -kIs https://${git_url} >/dev/null
      if [ $? != 0 ];then
         echo "failed"
      else
         echo "ok"
         server_url=${git_url}
         break
      fi
   done
}
function _get_latest_version() {
   if [[ -x "$(command -v python)" ]];then
      py_cmd='python'
   elif [[ -x "$(command -v python3)" ]]; then
      py_cmd='python3'
   fi

   _get_available_server

   if [[ "x${server_url}" == "x" ]];then
      echo "无法连接版本服务器，请稍候重试"
      exit 1
   fi

   if [[ "${server_url}" == "gitee.com" ]];then
      owner='fit2cloud-feizhiyun'
      repo='DataEase'
      gitee_release_content=$(curl -s https://gitee.com/api/v5/repos/${owner}/${repo}/releases/latest)
      # export LC_ALL="en_US.utf8"
      latest_version=$($py_cmd -c "import json; obj=json.loads('$gitee_release_content', strict=False); print(obj['tag_name']);")
   else
      owner='dataease'
      repo='dataease'
      latest_version=$(curl -s https://api.github.com/repos/${owner}/${repo}/releases/latest | grep -e "\"tag_name\"" | sed -r 's/.*: "(.*)",/\1/')      
   fi
}
function status() {
   echo
   echo "DataEase 容器运行状态"
   cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} ps
   
   echo
   docker_root_dir=$(docker info | grep "Docker Root Dir"  | awk -F': ' '{print $2}')
   echo "Docker 目录及文件大小 : " 
   du -sh $docker_root_dir
   echo
   echo "Docker 目录所在磁盘使用情况 : " 
   df -H $docker_root_dir

   echo
   echo "日志文件大小 : "
   du -Sh ${DE_BASE}/dataease/logs/

   echo
   echo "DataEase 运行目录及文件大小 : " 
   du -sh ${DE_BASE}
   echo
   echo "DataEase 运行目录使用情况 : " 
   df -H ${DE_BASE}
   
   echo
   read available_disk percent_disk<<< $(df -H --output=avail,pcent ${DE_BASE} | tail -1)
   available_disk=${available_disk%?}
   percent_disk=${percent_disk%?}
      if [[ $available_disk < 2.0 ]] && [[ $percent_disk > 85 ]];then
      echo -e "\033[31m[警告] DataEase 运行目录所在磁盘剩余空间不足 2G 且磁盘使用率超过 85%，Apache Doris 可能无法正常启动!\033[0m"
   fi

   _healthcheck
}
function start() {
   echo
   cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} start ${target}
   _healthcheck
}
function stop() {
   echo
   cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} stop ${target}
}
function restart() {
   echo
   cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} restart ${target}
   _healthcheck
}
function reload() {
   echo
   cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} up -d
   _healthcheck
}
function uninstall() {
   echo
   cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} down -v ${target}
}
function version() {
   echo
   _get_current_version
   echo "current version is $current_version"
   _get_latest_version
   echo "latest version is $latest_version"
}
function _clear_component_docker_images() {
   component=$1
   compose_file=${DE_BASE}/dataease/docker-compose-${component}.yml
   if [ $1 = "dataease" ];then
      compose_file=${DE_BASE}/dataease/docker-compose.yml
   fi
   component_image_defined=$(grep "^    image:.*/$component:" ${compose_file} | uniq)
   component_version=$(echo ${component_image_defined} | awk -F"${component}:" '{print $2}' | uniq)
   component_image=$(echo ${component_image_defined} | awk -F'image: ' '{print $2}' | awk -F':' '{print $1}')

   if [[ $(docker images | grep "dataease" | grep "$component_image" | grep -v " $component_version ") == 0 ]]; then
      echo "$component_image 不存在旧版本镜像"
   else
      echo "清理${component}镜像"
      docker rmi $(docker images | grep "dataease" | grep "$component_image" | grep -v " $component_version " | awk -F' ' '{print $1":"$2}')
      echo "清理完毕"
   fi
}
function clear_images() {
   echo
   _clear_component_docker_images 'dataease'
   _clear_component_docker_images 'doris'
   _clear_component_docker_images 'kettle'
   _clear_component_docker_images 'mysql'
   if test ! -z "$(docker images -f dangling=true -q)"; then
      echo "清理虚悬镜像"
      docker rmi $(docker images -f dangling=true -q)
      echo "清理完毕"
   fi
}
function clear_logs() {
   echo "开始清理 DataEase 历史日志"
   rm -rf ${DE_BASE}/dataease/logs/dataease/history/*
   echo "清理完毕"

   echo "开始清理 Apache Doris FE 日志"
   rm -rf ${DE_BASE}/dataease/logs/fe/fe.gc.log.*
   echo "" > ${DE_BASE}/dataease/logs/fe/fe.out
   echo "清理完毕"   

   echo "开始清理 Apache Doris BE 日志"
   echo "" > ${DE_BASE}/dataease/logs/be/be.INFO
   echo "" > ${DE_BASE}/dataease/logs/be/be.WARNING
   echo "" > ${DE_BASE}/dataease/logs/be/be.out
   echo "清理完毕"
}
function upgrade() {
   version

   if [ "${latest_version}" = "" ];then
      echo "未获取到最新版本"
      exit 1
   elif [ "${latest_version}" = "${current_version}" ];then
      echo "最新版本与当前版本一致,退出升级过程"
      exit 0
   else
      if [[ "$latest_version" =~ ^v2.* ]];then
         echo "获取到的最新版本与当前版本不匹配，请访问 https://community.fit2cloud.com/#/products/dataease/downloads 下载离线安装包"
         exit 1
      else
         echo -e "\e[32m 检测到最新版本为\e[1;33m${latest_version}\e[0;32m 即将执行在线升级...\e[0m"
      fi
   fi
   sleep 2s

   echo "使用下载服务器 ${server_url}"
   cd /tmp
   download_url="https://${server_url}/${owner}/${repo}/releases/download/${latest_version}/dataease-${latest_version}-online.tar.gz"

   curl -LOk -m 60 -o dataease-${latest_version}-online.tar.gz $download_url
   if [ $? -ne 0 ]; then
      echo -e "\e[31m升级失败:连接下载服务器超时！\n可手动下载升级包，然后执行\e[1;33m /bin/bash install.sh \e[0;31m离线升级，也可以重新执行一次 dectl upgrade 命令。\e[0m"
      return 2
   fi

   if [ ! -f dataease-${latest_version}-online.tar.gz ];then
      echo "下载在线安装包失败，请试试重新执行一次安装命令。"
      exit 1
   fi

   tar zxf dataease-${latest_version}-online.tar.gz
   if [ $? != 0 ];then
      echo "下载在线安装包失败，请试试重新执行一次安装命令。"
      rm -f dataease-${latest_version}-online.tar.gz
      exit 1
   fi

   cd dataease-${latest_version}-online
   /bin/bash install.sh

   cd ..
   rm -rf /tmp/dataease-${latest_version}-online
}
function backup() {
   need_stop=0
   if [[ -z $1 ]];then
      echo "如需备份 DataEase 数据，建议您先停止 DataEase 服务，以保证备份数据的完整性。"
      read -r -p "即将备份 DataEase 数据，是否需要停止 DataEase 服务? [Y/n] " input

      case $input in
         [yY][eE][sS]|[yY])
            echo "Yes"
            need_stop=1
            ;;
         [nN][oO]|[nN])
            echo "No"
            ;;
         *)
            echo "无效输入..."
            exit 1
            ;;
      esac
   elif [[ "$1" == "stop" ]];then
      need_stop=1
   fi

   if [[ $need_stop == 1 ]];then
      service dataease stop
   else
      echo "不停服进行备份"
   fi

   echo "开始备份，建议在备份时先停止 DataEase 服务!"
   backup_file_name=dataease-backup-$(date +%Y%m%d)_$(date +%H%M%S).tar.gz
   tar --exclude=logs/* -zcf $backup_file_name -C $DE_BASE/dataease .
   if [ $? -ne 0 ]; then
      echo "备份失败"
      exit 1
   else
      echo "备份成功，备份文件 : $backup_file_name"
   fi

   if [[ $need_stop == 1 ]];then
      service dataease start
   fi
}
function restore() {
   if [[ -z $target ]];then
      echo "未指定需要恢复的备份文件！"
      exit 1
   elif [[ -f $target ]];then
      service dataease stop
      if [[ ! -d $DE_BASE/dataease ]];then
         mkdir -p $DE_BASE/dataease
      fi
      echo "恢复备份 $target"
      tar -zxf $target --directory=$DE_BASE/dataease
      service dataease start
   else
      echo "未找到备份文件 $target！"
      exit 1
   fi
}
function main() {
    case "${action}" in
      status)
         status
         ;;
      start)
         start
         ;;
      stop)
         stop
         ;;
      restart)
         restart
         ;;
      reload)
         reload
         ;;
      uninstall)
         uninstall
         ;;
      upgrade)
         upgrade
         ;;
      backup)
         backup $target
         ;;
      restore)
         restore $target
         ;;
      version)
         version
         ;;
      clear-images)
         clear_images
         ;;
      clear-logs)
         clear_logs
         ;;
      help)
         usage
         ;;
      --help)
         usage
         ;;
      *)
         echo "不支持的参数，请使用 help 或 --help 参数获取帮助"
         ;;
    esac
}
main